import {
  addInterceptor,
  Chain,
  showToast,
  request, navigateTo
} from '@tarojs/taro';
import CodeConstant from '@/constant/CodeConstant';
import authStore from '@/stores/AuthStore';
import AuthConstant from '@/constant/AuthConstant';
import useLandlord from '@/hooks/useLandlord';
import useTenant from '@/hooks/useTenant';

/**
 * 请求拦截器与响应拦截器
 */
addInterceptor((chain: Chain) => {
  // 请求拦截器
  Object.assign(chain.requestParams, {
    timeout: 8000,
    header: {
      authorization: authStore.token,
    },
  });
  // 响应拦截器
  return chain
    .proceed(chain.requestParams)
    .then((res: any) => {
      // 客户端与服务联系成功
      if (res.statusCode === 200) {
        if (res.header.Token) {
          // 后端返回了Token字段，说明是登录接口请求成功
          authStore.setLoginState(true, res.header.Token);
        }
        if (res.data && res.data.code === CodeConstant.SUCCESS) {// 获取服务器成功的数据
          return res.data?.data;
        } else if (res.data && res.data.code === CodeConstant.NOT_LOGIN_ERROR) {//未登录
          if (authStore.isLogin) {
            if (authStore.identity === AuthConstant.TENANT) { // 租客身份
              useTenant().tenantLogout();
            } else if (authStore.identity === AuthConstant.LANDLORD) { // 房东身份
              useLandlord().landlordLogout();
            }
            navigateTo({url: '/pages/tabbar/index'});
          }
          showToast({title: '未登录', icon: 'error'});
          return new Promise(() => {
          });
        } else if (res.data?.status === 0) { // 腾讯地图api
          return res.data;
        } else {
          showToast({title: res.data.message, icon: 'none'});
          return new Promise(() => {
          });
        }
      }
      return Promise.reject(res);
    })
    .catch((error: any) => {
      // 代表与服务器联系失败
      showToast({
        title: '出错了！',
        icon: 'error'
      });
      return Promise.reject(error);
    });
});

/**
 * Taro 发送请求
 * @param method 请求方法
 * @param url 请求地址
 * @param data 请求参数
 */
export default function <T = any>(params: {
  method: 'GET' | 'POST' | 'PUT' | 'DELETE';
  url: string;
  data?: T;
}) {
  const {url, method, data = null} = params;
  return request({
    url,
    method,
    data,
  });
}
